/**
 * LVGL学习用PC模拟器 - 纯控制台版本
 * 
 * 功能：
 * - 演示LVGL的基本概念和API使用
 * - 在控制台显示仪表盘数据
 * - 无需真实LVGL库，专注于学习
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>

#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif

// 配置常量
#define SCREEN_WIDTH    800
#define SCREEN_HEIGHT   600
#define MAX_SPEED       220
#define UPDATE_INTERVAL 50  // 50ms

// 仪表盘数据
static int current_speed = 0;
static int target_speed = 0;
static int current_rpm = 800;
static int current_gear = 1;
static int fuel_level = 85;
static bool is_running = true;

// 统计信息
static int frame_count = 0;
static time_t start_time;

/**
 * 清屏函数
 */
void clear_screen(void) {
#ifdef _WIN32
    system("cls");
#else
    system("clear");
#endif
}

/**
 * 设置控制台颜色（Windows）
 */
void set_console_color(int color) {
#ifdef _WIN32
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
#else
    // Linux使用ANSI颜色代码
    switch(color) {
        case 10: printf("\033[32m"); break; // 绿色
        case 12: printf("\033[31m"); break; // 红色
        case 14: printf("\033[33m"); break; // 黄色
        case 15: printf("\033[37m"); break; // 白色
        default: printf("\033[0m");  break; // 重置
    }
#endif
}

/**
 * 绘制ASCII艺术仪表盘
 */
void draw_speedometer(void) {
    printf("        ╭─────────────────────────────────╮\n");
    printf("       ╱                               ╲\n");
    printf("      ╱           🚗 速度表              ╲\n");
    printf("     ╱                                   ╲\n");
    printf("    │    0    40    80   120   160   200  │\n");
    printf("    │     ╲    ╲     ╲    ╲     ╲     ╱   │\n");
    printf("    │      ╲    ╲     ╲    🔘─────╱     │\n");
    printf("    │       ╲    ╲     ╲       ╱       │\n");
    printf("    │        ╲____╲_____╲_____╱        │\n");
    printf("     ╲                                 ╱\n");
    printf("      ╲         %3d km/h             ╱\n", current_speed);
    printf("       ╲_______________________________╱\n");
}

/**
 * 绘制转速表
 */
void draw_rpm_gauge(void) {
    printf("     ╭─────────────────╮\n");
    printf("    ╱     🌀 转速表      ╲\n");
    printf("   ╱                     ╲\n");
    printf("  │  0  2  4  6  8 x1000 │\n");
    printf("  │   ╲  ╲  🔴─────╱     │\n");
    printf("   ╲     %4d RPM       ╱\n", current_rpm);
    printf("    ╲___________________╱\n");
}

/**
 * 绘制燃油表
 */
void draw_fuel_gauge(void) {
    printf("  ╭─────────────╮\n");
    printf(" ╱   ⛽ 燃油表   ╲\n");
    printf("│   E ■■■■■ F  │\n");
    
    // 绘制燃油条
    printf("│     ");
    int fuel_bars = fuel_level / 20;
    for (int i = 0; i < 5; i++) {
        if (i < fuel_bars) {
            set_console_color(10); // 绿色
            printf("█");
        } else {
            set_console_color(15); // 白色
            printf("░");
        }
    }
    set_console_color(15);
    printf("    │\n");
    printf(" ╲     %3d%%     ╱\n", fuel_level);
    printf("  ╲_____________╱\n");
}

/**
 * 绘制档位指示器
 */
void draw_gear_indicator(void) {
    printf("  ╭─────────╮\n");
    printf(" ╱  🔧 档位  ╲\n");
    printf("│           │\n");
    printf("│     ");
    
    if (current_gear == 0) {
        set_console_color(12); // 红色
        printf("P");
    } else {
        set_console_color(10); // 绿色
        printf("%d", current_gear);
    }
    set_console_color(15);
    printf("     │\n");
    printf(" ╲___________╱\n");
}

/**
 * 绘制警告灯
 */
void draw_warning_lights(void) {
    printf("╭─────────────────────────╮\n");
    printf("│      🚨 警告指示灯        │\n");
    printf("│                         │\n");
    
    // 引擎警告
    if (current_speed > 180 || current_rpm > 6500) {
        set_console_color(12); // 红色
        printf("│  ⚠️  引擎警告    ");
    } else {
        set_console_color(10); // 绿色
        printf("│  ✅  引擎正常    ");
    }
    
    // 燃油警告
    if (fuel_level < 20) {
        set_console_color(14); // 黄色
        printf("⛽ 燃油不足  │\n");
    } else {
        set_console_color(10); // 绿色
        printf("⛽ 燃油充足  │\n");
    }
    
    set_console_color(15);
    printf("│                         │\n");
    printf("╰─────────────────────────╯\n");
}

/**
 * 绘制完整仪表盘
 */
void draw_dashboard(void) {
    clear_screen();
    
    printf("═══════════════════════════════════════════════════════════════\n");
    printf("                   🚗 LVGL汽车仪表盘模拟器\n");
    printf("═══════════════════════════════════════════════════════════════\n\n");
    
    // 主仪表盘
    draw_speedometer();
    printf("\n");
    
    // 辅助仪表（水平布局）
    printf("   转速表                    燃油表               档位\n");
    printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
    
    // 使用简化的水平显示
    printf("🌀 转速: %4d RPM", current_rpm);
    printf("     ⛽ 燃油: %3d%%", fuel_level);
    printf("     🔧 档位: ");
    if (current_gear == 0) {
        set_console_color(12);
        printf("P");
    } else {
        set_console_color(10);
        printf("%d", current_gear);
    }
    set_console_color(15);
    printf("\n\n");
    
    // 警告指示灯
    draw_warning_lights();
    
    // 状态信息
    printf("\n");
    printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
    printf("📊 状态: ");
    if (current_speed == target_speed) {
        set_console_color(10);
        printf("匀速行驶");
    } else if (current_speed < target_speed) {
        set_console_color(14);
        printf("加速中...");
    } else {
        set_console_color(12);
        printf("减速中...");
    }
    set_console_color(15);
    
    printf("  |  🎯 目标速度: %d km/h", target_speed);
    
    time_t current_time = time(NULL);
    int elapsed = (int)(current_time - start_time);
    printf("  |  ⏱️  运行时间: %02d:%02d", elapsed / 60, elapsed % 60);
    
    printf("  |  🔄 帧数: %d\n", frame_count);
    
    printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
    printf("💡 提示: 按 Ctrl+C 退出程序\n");
}

/**
 * 更新仪表盘数据
 */
void update_dashboard(void) {
    // 平滑速度变化
    if (current_speed < target_speed) {
        current_speed += 2;
        if (current_speed > target_speed) current_speed = target_speed;
    } else if (current_speed > target_speed) {
        current_speed -= 2;
        if (current_speed < target_speed) current_speed = target_speed;
    }
    
    // 计算转速
    current_rpm = 800 + (current_speed * 25);
    if (current_rpm > 7000) current_rpm = 7000;
    
    // 计算档位
    if (current_speed == 0) {
        current_gear = 0; // P档
    } else if (current_speed < 20) {
        current_gear = 1;
    } else if (current_speed < 40) {
        current_gear = 2;
    } else if (current_speed < 60) {
        current_gear = 3;
    } else if (current_speed < 80) {
        current_gear = 4;
    } else {
        current_gear = 5;
    }
    
    // 更新燃油（模拟消耗）
    if (current_speed > 0) {
        static int fuel_counter = 0;
        fuel_counter++;
        if (fuel_counter % 200 == 0) {  // 每10秒消耗1%
            fuel_level--;
            if (fuel_level < 0) fuel_level = 0;
        }
    }
    
    frame_count++;
}

/**
 * 模拟驾驶行为
 */
void simulate_driving(void) {
    static int direction = 1;
    static int counter = 0;
    static int last_change = 0;
    
    counter++;
    
    // 每5秒改变一次目标速度
    if (counter - last_change > 100) {  // 100 * 50ms = 5秒
        if (target_speed >= MAX_SPEED - 20) {
            direction = -1;
        } else if (target_speed <= 10) {
            direction = 1;
        }
        
        int speed_change = 10 + (rand() % 30);
        target_speed += direction * speed_change;
        
        if (target_speed < 0) target_speed = 0;
        if (target_speed > MAX_SPEED) target_speed = MAX_SPEED;
        
        last_change = counter;
    }
}

/**
 * 主循环
 */
void main_loop(void) {
    printf("🚗 启动LVGL仪表盘模拟器...\n");
    printf("按 Ctrl+C 退出\n\n");
    
#ifdef _WIN32
    Sleep(2000); // 等待2秒
#else
    sleep(2);
#endif
    
    start_time = time(NULL);
    
    while (is_running) {
        // 模拟驾驶
        simulate_driving();
        
        // 更新仪表盘
        update_dashboard();
        
        // 绘制界面
        draw_dashboard();
        
        // 延时
#ifdef _WIN32
        Sleep(UPDATE_INTERVAL * 20);  // Windows下刷新慢一些，避免闪烁
#else
        usleep(UPDATE_INTERVAL * 1000);
#endif
    }
}

/**
 * 显示帮助信息
 */
void show_help(const char* program_name) {
    printf("LVGL汽车仪表盘PC模拟器\n");
    printf("═══════════════════════\n\n");
    printf("用法: %s [选项]\n\n", program_name);
    printf("选项:\n");
    printf("  -s <速度>    设置初始速度 (0-%d km/h)\n", MAX_SPEED);
    printf("  -h, --help   显示此帮助信息\n\n");
    printf("功能特性:\n");
    printf("  • 实时显示速度、转速、档位、燃油信息\n");
    printf("  • 自动模拟驾驶场景\n");
    printf("  • ASCII艺术仪表盘界面\n");
    printf("  • 彩色警告指示灯\n");
    printf("  • 运行状态统计\n\n");
    printf("学习要点:\n");
    printf("  • LVGL基本概念和API使用\n");
    printf("  • 仪表盘界面设计\n");
    printf("  • 实时数据更新机制\n");
    printf("  • 嵌入式GUI开发思路\n\n");
}

/**
 * 主函数
 */
int main(int argc, char* argv[]) {
    // 设置控制台为UTF-8编码（Windows）
#ifdef _WIN32
    SetConsoleOutputCP(65001);
#endif
    
    // 解析命令行参数
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "-s") == 0 && i + 1 < argc) {
            target_speed = atoi(argv[i + 1]);
            if (target_speed < 0) target_speed = 0;
            if (target_speed > MAX_SPEED) target_speed = MAX_SPEED;
            current_speed = target_speed; // 立即设置为目标速度
            i++;
        } else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) {
            show_help(argv[0]);
            return 0;
        }
    }
    
    // 初始化随机数
    srand((unsigned int)time(NULL));
    
    printf("初始化LVGL PC模拟器...\n");
    printf("分辨率: %dx%d\n", SCREEN_WIDTH, SCREEN_HEIGHT);
    printf("初始速度: %d km/h\n", current_speed);
    
    // 运行主循环
    main_loop();
    
    printf("\n👋 LVGL仪表盘模拟器已退出\n");
    return 0;
}